// 奶牛坐电梯 状压dp 分组问题 递推版
// https://www.luogu.com.cn/problem/P3052
int n, m, all;
int a[maxn];
int sum[1 << maxn]; // 状态为 s 时，物品的体积总和
int f[1 << maxn];   // 状态为 s 时，最小分组数量

void init() {
    for (int i = 0; i < n; ++i)
        sum[1 << i] = a[i];
    for (int s = 0; s <= all; ++s) {
        int low = s & -s;
        sum[s] = sum[s ^ low] + sum[low];
    }
}
int main() {
    // for short
    memset(f, inf, sizeof(f));
    f[0] = 0;
    for (int s = 0; s <= all; ++s) {
        int low = s & -s, s0 = s ^ low; // 枚举 s0 的子集，模拟 lowbit 加入状态的过程
        for (int to = s0; to > 0; to = (to - 1) & s0)
            if (sum[to | low] <= m) // 可放在一组
                f[s] = min(f[s], f[s ^ (to | low)] + 1);
        if (sum[low] <= m) // lowbit 单独一组的情况
            f[s] = min(f[s], f[s ^ low] + 1);
    }

    printf("%d", f[all]);
}
